|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T i
Length: 10805 (0x2a35) Types: TextFile Names: »ibtools.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibtools.c«
/* * Copyright (c) 1991 Stanford University * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided * that the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Stanford not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Stanford makes no representations about * the suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* * Implementation of user interface builder-specific tools. * $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibtools.c,v 1.2 91/09/27 14:12:15 tang Exp $ */ #include "ibadjuster.h" #include "ibbutton.h" #include "ibclasses.h" #include "ibcmds.h" #include "ibinteractor.h" #include "ibgrblock.h" #include "ibgrcomp.h" #include "ibmanips.h" #include "ibscroller.h" #include "ibtools.h" #include "ibvars.h" #include <Unidraw/iterator.h> #include <Unidraw/editor.h> #include <Unidraw/manips.h> #include <Unidraw/selection.h> #include <Unidraw/viewer.h> #include <Unidraw/Components/grview.h> #include <InterViews/event.h> #include <InterViews/message.h> #include <InterViews/shape.h> /*****************************************************************************/ CommandItem::CommandItem( const char* str, Alignment al, Command* cmd ) : MenuItem(str, al) { _executed = false; _cmd = cmd; } CommandItem::~CommandItem() { if (!_executed) { delete _cmd; } } void CommandItem::Do () { _executed = true; _cmd->Execute(); if (_cmd->Reversible()) { _cmd->Log(); } else { delete _cmd; } } /*****************************************************************************/ void ComputeViewPath (Event& e, GraphicView* views, Selection* s){ Selection* newSel = views->ViewIntersecting(e.x-SLOP, e.y-SLOP, e.x+SLOP, e.y+SLOP); Iterator i; if (newSel != nil) { for (newSel->First(i); !newSel->Done(i); newSel->Next(i)) { GraphicView* gv = newSel->GetView(i); if (gv != nil) { s->Append(gv); ComputeViewPath(e, gv, s); } } delete newSel; } } const char* GetName (GraphicComp* comp) { return ((IBNameVar*) comp->GetState("ClassNameVar"))->GetName(); } /*****************************************************************************/ TabTool::TabTool () {} Manipulator* TabTool::CreateManipulator ( Viewer* v, Event& e, Transformer* rel ) { Iterator i; Selection* s = v->GetSelection(); s->First(i); GraphicView* gv = s->GetView(i); return gv->CreateManipulator(v, e, rel, this); } ClassId TabTool::GetClassId () { return TAB_TOOL; } boolean TabTool::IsA (ClassId id) {return TAB_TOOL==id||ReshapeTool::IsA(id);} /*****************************************************************************/ ClassId ExamineTool::GetClassId () { return EXAMINE_TOOL; } boolean ExamineTool::IsA (ClassId id) {return EXAMINE_TOOL==id||Tool::IsA(id);} ExamineTool::ExamineTool (ControlInfo* m) : Tool(m) { _selPath = nil; } ExamineTool::~ExamineTool () { delete _selPath; } Tool* ExamineTool::Copy () { return new ExamineTool(CopyControlInfo()); } Manipulator* ExamineTool::CreateManipulator ( Viewer* v, Event& e, Transformer* t ){ GraphicView* views = v->GetGraphicView(); Selection* s = v->GetSelection(); _selPath = new Selection; Manipulator* m = nil; s->Clear(); ComputeViewPath(e, views, _selPath); if (!_selPath->IsEmpty()) { Iterator i; _selPath->First(i); GraphicView* gv = _selPath->GetView(i); s->Append(gv); s->Update(); _selPath->Last(i); gv = _selPath->GetView(i); m = gv->CreateManipulator(v, e, t, this); } delete _selPath; return m; } Control* ExamineTool::CreateInfoEntry (Selection* s, Editor* ed) { Control* ctrl = nil; Iterator i; if (s->Number() > 1) { Menu* m = new H_PullrightMenu(new Message("Info...", Center, 2, hfil)); ctrl = m; for (s->First(i); !s->Done(i); s->Next(i)) { GraphicView* view = (GraphicView*) s->GetView(i); GraphicComp* comp = view->GetGraphicComp(); InfoCmd* cmd = new InfoCmd(ed, view); m->Include(new CommandItem(GetName(comp), Center, cmd)); } } else { s->First(i); GraphicView* view = (GraphicView*) s->GetView(i); ctrl = new CommandItem("Info...", Center, new InfoCmd(ed, view)); } return ctrl; } Control* ExamineTool::CreatePropsEntry (Selection* s, Editor* ed) { Control* ctrl = nil; Iterator i; if (s->Number() > 1) { for (s->First(i); !s->Done(i); s->Next(i)) { GraphicComp* comp = s->GetView(i)->GetGraphicComp(); if (comp->IsA(INTERACTOR_COMP)) { if (ctrl == nil) { ctrl = new H_PullrightMenu( new Message("Props...", Center, 2, hfil) ); } Menu* m = (Menu*) ctrl; PropsCmd* cmd = new PropsCmd(ed, (InteractorComp*) comp); m->Include(new CommandItem(GetName(comp), Center, cmd)); } } } else { s->First(i); GraphicComp* comp = s->GetView(i)->GetGraphicComp(); if (comp->IsA(INTERACTOR_COMP)) { ctrl = new CommandItem( "Props...", Center, new PropsCmd(ed, (InteractorComp*) comp) ); } } return ctrl; } /*****************************************************************************/ ClassId NarrowTool::GetClassId () { return NARROW_TOOL; } boolean NarrowTool::IsA (ClassId id) {return NARROW_TOOL==id||Tool::IsA(id);} NarrowTool::NarrowTool (ControlInfo* m) : Tool(m) { _popup = false; } Tool* NarrowTool::Copy () { return new NarrowTool(CopyControlInfo()); } Manipulator* NarrowTool::CreateManipulator (Viewer* v, Event& e,Transformer*){ Manipulator* m = nil; _popup = false; GraphicView* views = v->GetGraphicView(); if (!e.shift_is_down()) { Selection* s = v->GetSelection(), *newSel = new Selection; s->Clear(); ComputeViewPath(e, views, newSel); if (!newSel->IsEmpty()) { Iterator i; newSel->First(i); GraphicView* gv = newSel->GetView(i); s->Append(gv); s->Update(); m = CreatePopupManip(newSel, v); _popup = true; } delete newSel; } else { m = new NarrowManip(v); } return m; } Command* NarrowTool::InterpretManipulator(Manipulator* manip) { Command* ncmd = nil; if (!_popup) { Iterator i; NarrowManip* nmanip = (NarrowManip*) manip; Editor* ed = nmanip->GetViewer()->GetEditor(); GraphicComp* parent = nmanip->GetParent(); if ( parent != nil && (parent->IsA(SCENE_COMP) || parent->IsA(IGRAPHIC_COMPS)) ){ ncmd = new NavigateCmd(ed, false, parent, nmanip->GetKid()); } } return ncmd; } static void RecurPopupInclude( Editor* ed, PopupMenu* popup, GraphicComp* kid ) { GraphicComp* parent = (GraphicComp*) kid->GetParent(); if (parent != nil) { RecurPopupInclude(ed, popup, parent); NavigateCmd* cmd = new NavigateCmd(ed, false, parent, kid); popup->Include(new CommandItem(GetName(parent), Center, cmd)); } } Control* NarrowTool::CreateViewEntry (Selection* s, Editor* ed) { Control* ctrl = nil; Iterator i; if (s->Number() >= 1) { H_PopupMenu* popup = new H_PopupMenu; ctrl = popup; s->First(i); GraphicComp* kid = s->GetView(i)->GetGraphicComp(); RecurPopupInclude(ed, popup, kid); popup->LockPosition(); for (;!s->Done(i); s->Next(i)) { GraphicView* gv = s->GetView(i); GraphicComp* parent = gv->GetGraphicComp(); if (parent->IsA(SCENE_COMP) || parent->IsA(IGRAPHIC_COMPS)){ GraphicComp* mykid = nil; Iterator j(i); s->Next(j); if (!s->Done(j)) { mykid = (GraphicComp*) s->GetView(j)->GetGraphicComp(); } NavigateCmd* cmd = new NavigateCmd(ed, false, parent, mykid); popup->Include(new CommandItem(GetName(parent), Center, cmd)); } } } return ctrl; } Manipulator* NarrowTool::CreatePopupManip (Selection* s, Viewer* v) { Manipulator* retval = nil; Editor* ed = v->GetEditor(); Control* view = CreateViewEntry(s, ed); if (view != nil) { retval = new PopupManip(v, (PopupMenu*) view, this); } return retval; } /*****************************************************************************/ ClassId RelateTool::GetClassId () { return RELATE_TOOL; } boolean RelateTool::IsA (ClassId id) {return RELATE_TOOL==id||Tool::IsA(id);} RelateTool::RelateTool (ControlInfo* m) : Tool(m) { } Tool* RelateTool::Copy () { return new RelateTool(CopyControlInfo()); } Manipulator* RelateTool::CreateManipulator (Viewer* v, Event&, Transformer*){ return new RelateManip(v, this); } Command* RelateTool::InterpretManipulator(Manipulator* m) { Command* cmd = nil; InteractorComp* src, *dest; RelateManip* rm = (RelateManip*) m; Editor* ed = rm->GetViewer()->GetEditor(); rm->GetSrcDest(src, dest); if (src != nil) { cmd = new RelateCmd(ed, src, dest); } return cmd; } /*****************************************************************************/ ClassId IBGraphicCompTool::GetClassId () { return IBGRAPHIC_COMP_TOOL; } boolean IBGraphicCompTool::IsA (ClassId id) { return IBGRAPHIC_COMP_TOOL == id || GraphicCompTool::IsA(id); } IBGraphicCompTool::IBGraphicCompTool () { } IBGraphicCompTool::IBGraphicCompTool ( ControlInfo* m, GraphicComp* proto ) : GraphicCompTool(m, proto) { } Tool* IBGraphicCompTool::Copy () { return new IBGraphicCompTool(CopyControlInfo(), GetPrototype()); }