|
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: 20645 (0x50a5) Types: TextFile Names: »ibtoolpanel.c«
└─⟦8648bda34⟧ Bits:30007244 EUUGD5_II: X11R5 └─⟦87c3ac0e0⟧ »./contrib-3/contrib-3.00« └─⟦de8ce1454⟧ └─⟦this⟧ »contrib/lib/iv/src/bin/ibuild/ibtoolpanel.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 IBHBox and ToolPanel. * $Header: /master/3.0/iv/src/bin/ibuild/RCS/ibtoolpanel.c,v 1.2 91/09/27 14:12:12 tang Exp $ */ #include "ibadjuster.h" #include "ibbitmap.h" #include "ibborder.h" #include "ibbox.h" #include "ibbutton.h" #include "ibclasses.h" #include "ibcmds.h" #include "ibcommandctrl.h" #include "ibctrl.h" #include "ibed.h" #include "ibfbrowser.h" #include "ibframe.h" #include "ibglue.h" #include "ibgrblock.h" #include "ibkybd.h" #include "ibmenu.h" #include "ibmessage.h" #include "ibpanner.h" #include "ibpanelctrl.h" #include "ibscroller.h" #include "ibslider.h" #include "ibstred.h" #include "ibstrbrowser.h" #include "ibtextedit.h" #include "ibtoolpanel.h" #include "ibviewer.h" #include "ibvars.h" #include <Unidraw/catalog.h> #include <Unidraw/ctrlinfo.h> #include <Unidraw/editorinfo.h> #include <Unidraw/globals.h> #include <Unidraw/keymap.h> #include <Unidraw/kybd.h> #include <Unidraw/iterator.h> #include <Unidraw/uarray.h> #include <Unidraw/unidraw.h> #include <Unidraw/Tools/grcomptool.h> #include <InterViews/box.h> #include <InterViews/shape.h> #include <string.h> #include <stdio.h> #include <stdlib.h> /*****************************************************************************/ class IBHBox : public MonoScene { public: IBHBox(); UArray& Components(); virtual void Reconfig(); protected: virtual void Resize(); virtual void DoInsert(Interactor*, boolean, Coord&, Coord&); virtual void DoRemove(Interactor*); private: class HBox* LastHBox(); class VBox* vbox(); Interactor* elem(int); void Recompose(); void DeleteHBoxes(); private: boolean _recomposing; UArray _elems; }; inline VBox* IBHBox::vbox () { return (VBox*) interior(); } inline Interactor* IBHBox::elem (int i) { return (Interactor*) _elems[i]; } inline UArray& IBHBox::Components () { return _elems; } IBHBox::IBHBox () { Insert(new VBox); _recomposing = false; } void IBHBox::Reconfig () { MonoScene::Reconfig(); shape->Rect(0, max(shape->height, 1)); shape->Rigid(hfil, hfil, 0, 0); } void IBHBox::Resize () { if (_recomposing) { MonoScene::Resize(); } else { _recomposing = true; Recompose(); _recomposing = false; } } void IBHBox::DoInsert (Interactor* i, boolean b, Coord& x, Coord& y) { if (interior() == nil) { MonoScene::DoInsert(i, b, x, y); } else { _elems.Insert(i, _elems.Count()); LastHBox()->Insert(i); } } void IBHBox::DoRemove (Interactor* i) { if (i == interior()) { MonoScene::DoRemove(i); } else if (i->Parent() != this) { i->Parent()->Remove(i); for (int j = 0; j < _elems.Count(); ++j) { if (elem(j) == i) { _elems.Remove(j); } } } } HBox* IBHBox::LastHBox () { HBox* hbox; Interactor** interactors; int n; vbox()->GetComponents(nil, 0, interactors, n); if (n == 0) { vbox()->Insert(hbox = new HBox); } else { hbox = (HBox*) interactors[n-1]; } delete interactors; return hbox; } void IBHBox::DeleteHBoxes () { for (int i = 0; i < _elems.Count(); ++i) { elem(i)->Parent()->Remove(elem(i)); } Interactor* inter = interior(); Remove(inter); delete inter; interior(nil); Insert(new VBox); } void IBHBox::Recompose () { DeleteHBoxes(); for (int i = 0; i < _elems.Count();) { int width = 0; HBox* new_hbox = nil; do { new_hbox = (new_hbox == nil) ? new HBox : new_hbox; int new_width = width + elem(i)->GetShape()->width; if (new_width > xmax+1 && width > 0) { break; } else { width = new_width; } new_hbox->Insert(elem(i)); } while (++i < _elems.Count()); if (new_hbox != nil) vbox()->Insert(new_hbox); } if (_elems.Count() == 0) { Change(interior()); } else { elem(0)->Parent()->Change(elem(0)); } } /*****************************************************************************/ static void GetToolsPath(char* toolspath) { const char* tooldir = getenv("TOOLDIR"); if (tooldir == nil) { sprintf(toolspath, "./"); } else { sprintf(toolspath, "%s", tooldir); } } /*****************************************************************************/ ToolPanel::ToolPanel (ControlState* crtl, KeyMap* key) { SetClassName("ToolPanel"); Insert(new IBHBox); _curCtrl = crtl; _curCtrl->Reference(); _keymap = key; InitEditorInfo(); InitTools(); if (_initEdInfo) { char setup[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; GetToolsPath(toolspath); sprintf(setup, "%s/TOOLS", toolspath); unidraw->GetCatalog()->Save(_edInfo, setup); } } ToolPanel::~ToolPanel () { Unref(_curCtrl); Iterator ed; unidraw->First(ed); if (unidraw->Done(ed) && _edInfo != nil) { delete _edInfo; } } Tool* ToolPanel::GetCurTool () { Tool* tool = nil; UControl* c = (UControl*) _curCtrl->Selection(); if (c != nil) { tool = (Tool*) c->GetControlInfo()->GetOwner(); } return tool; } Scene* ToolPanel::GetScene () { return (Scene*) interior(); } void ToolPanel::AddTool (UControl* ctrl) { GetScene()->Insert(ctrl); } void ToolPanel::RemoveTool (UControl* ctrl) { GetScene()->Remove(ctrl); Tool* tool = (Tool*) ctrl->GetControlInfo()->GetOwner(); if (tool == GetCurTool()) { _keymap->Execute(CODE_SELECT); } _keymap->Unregister(ctrl); delete ctrl; } void ToolPanel::Install (const char* toolName, Tool* tool) { char setup[CHARBUFSIZE]; char filename[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; Catalog* catalog = unidraw->GetCatalog(); GetToolsPath(toolspath); sprintf(setup, "%s/TOOLS", toolspath); sprintf(filename, "%s/%s", toolspath, toolName); if (tool == nil) { catalog->Retrieve(filename, tool); if (tool != nil) { Uninstall(toolName); ControlInfo* info = tool->GetControlInfo(); UControl* ctrl = new ToolPanelControl(info, _curCtrl); AddTool(ctrl); if (_edInfo != nil ) { _edInfo->UnregisterName(toolName); _edInfo->Register(toolName); catalog->Save(tool, filename); catalog->Save(_edInfo, setup); } } } else { Uninstall(toolName); ControlInfo* info = tool->GetControlInfo(); UControl* ctrl = new ToolPanelControl(info, _curCtrl); AddTool(ctrl); if (_edInfo != nil ) { _edInfo->UnregisterName(toolName); _edInfo->Register(toolName); catalog->Save(tool, filename); catalog->Save(_edInfo, setup); } } } void ToolPanel::Uninstall(const char* toolName) { UControl* ctrl = FindControl(toolName); Catalog* catalog = unidraw->GetCatalog(); char setup[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; GetToolsPath(toolspath); sprintf(setup, "%s/TOOLS", toolspath); if (ctrl != nil) { if (_edInfo != nil) { _edInfo->UnregisterName(toolName); catalog->Save(_edInfo, setup); } RemoveTool(ctrl); } } boolean ToolPanel::InstallOrRemove (Tool* tool, const char* toolName) { char setup[CHARBUFSIZE]; char filename[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; boolean install = false; UControl* ctrl = FindControl(toolName); Catalog* catalog = unidraw->GetCatalog(); GetToolsPath(toolspath); sprintf(setup, "%s/TOOLS", toolspath); sprintf(filename, "%s/%s", toolspath, toolName); if (ctrl == nil) { if (tool == nil) { catalog->Retrieve(toolName, tool); } if (tool != nil) { ctrl = new ToolPanelControl(tool->GetControlInfo(), _curCtrl); AddTool(ctrl); if (_edInfo != nil ) { _edInfo->Register(toolName); catalog->Save(tool, filename); catalog->Save(_edInfo, setup); } install = true; } } else { if (_edInfo != nil) { _edInfo->UnregisterName(toolName); catalog->Save(_edInfo, setup); } RemoveTool(ctrl); } return install; } void ToolPanel::Include (Tool* tool, const char* toolName) { char path[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; GetToolsPath(toolspath); ControlInfo* ctrlInfo = tool->GetControlInfo(); UControl* ctrl = new ToolPanelControl(ctrlInfo, _curCtrl); _keymap->Register(ctrl); AddTool(ctrl); if (_initEdInfo && *toolName != '\0') { sprintf(path, "%s/%s", toolspath, toolName); _edInfo->Register(toolName); unidraw->GetCatalog()->Save(tool, path); } } void ToolPanel::InitEditorInfo () { char setup[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; Catalog* catalog = unidraw->GetCatalog(); GetToolsPath(toolspath); sprintf(setup, "%s/TOOLS", toolspath); if (catalog->Retrieve(setup, _edInfo)) { _initEdInfo = false; } else { _edInfo = new EditorInfo; _initEdInfo = true; } } void ToolPanel::InitTools () { if (_edInfo == nil || _initEdInfo ) { InitCompTools(); } else { ReadCompTools(); } } void ToolPanel::InitCompTools () { const int unit = round(.5*cm); AdjusterComp* adjcomp; GlueGraphic* hglue = new GlueGraphic(0, Horizontal, nil, stdgraphic); GlueComp* hglueComp = new GlueComp(hglue); Include( new GraphicCompTool( new ControlInfo("HGlue", KLBL_HGLUE, CODE_HGLUE), hglueComp ), "HGlue.Tool" ); GlueGraphic* vglue = new GlueGraphic(0, Vertical, nil, stdgraphic); GlueComp* vglueComp = new GlueComp(vglue); Include( new GraphicCompTool( new ControlInfo("VGlue", KLBL_VGLUE, CODE_VGLUE), vglueComp ), "VGlue.Tool" ); MenuItemGraphic* mig = new MenuItemGraphic("MenuItem", nil, stdgraphic); MenuItemComp* micomp = new MenuItemComp(mig); Include( new GraphicCompTool( new ControlInfo(micomp, KLBL_MENUITEM, CODE_MENUITEM), micomp ), "Menu_Item.Tool" ); PushButtonGraphic* pbg = new PushButtonGraphic("push", nil, stdgraphic); ButtonComp* pbcomp = new ButtonComp(pbg); Include( new GraphicCompTool( new ControlInfo(pbcomp, KLBL_PUSHBUTTON, CODE_PUSHBUTTON), pbcomp ), "Push_Button.Tool" ); RadioButtonGraphic* rbg = new RadioButtonGraphic("radio", nil, stdgraphic); ButtonComp* rbcomp = new ButtonComp(rbg); Include( new GraphicCompTool( new ControlInfo(rbcomp, KLBL_RADIOBUTTON, CODE_RADIOBUTTON), rbcomp ), "Radio_Button.Tool" ); CheckBoxGraphic* cbg = new CheckBoxGraphic("check", nil, stdgraphic); ButtonComp* cbcomp = new ButtonComp(cbg); Include( new GraphicCompTool( new ControlInfo(cbcomp, KLBL_CHECKBOX, CODE_CHECKBOX), cbcomp ), "Check_Box.Tool" ); BorderGraphic* hborder = new BorderGraphic(Horizontal,nil,stdgraphic,unit); BorderComp* hborderComp = new BorderComp(hborder); Include( new GraphicCompTool( new ControlInfo(hborderComp, KLBL_HBORDER,CODE_HBORDER),hborderComp ), "HBorder.Tool" ); BorderGraphic* vborder = new BorderGraphic(Vertical, nil, stdgraphic,unit); BorderComp* vborderComp = new BorderComp(vborder); Include( new GraphicCompTool( new ControlInfo(vborderComp, KLBL_VBORDER,CODE_VBORDER),vborderComp ), "VBorder.Tool" ); ScrollerGraphic* hscr =new ScrollerGraphic(Horizontal,nil,stdgraphic,unit); ScrollerComp* hscrComp = new ScrollerComp(hscr); Include( new GraphicCompTool( new ControlInfo(hscrComp, KLBL_HSCROLLER, CODE_HSCROLLER), hscrComp ), "HScroller.Tool" ); ScrollerGraphic* vscr = new ScrollerGraphic(Vertical, nil,stdgraphic,unit); ScrollerComp* vscrComp = new ScrollerComp(vscr); Include( new GraphicCompTool( new ControlInfo(vscrComp, KLBL_VSCROLLER, CODE_VSCROLLER), vscrComp ), "VScroller.Tool" ); SliderGraphic* slgr = new SliderGraphic(unit, unit, nil,stdgraphic); SliderComp* sliderComp = new SliderComp(slgr); Include( new GraphicCompTool( new ControlInfo(sliderComp, KLBL_SLIDER, CODE_SLIDER), sliderComp ), "Slider.Tool" ); PannerComp* panComp = new PannerComp; Include( new GraphicCompTool( new ControlInfo("Panner", KLBL_PANNER,CODE_PANNER), panComp ), "Panner.Tool" ); MessageGraphic* msg = new MessageGraphic("Message", nil,stdgraphic); MessageComp* msgComp = new MessageComp(msg); Include( new GraphicCompTool( new ControlInfo(msgComp, KLBL_MESSAGE, CODE_MESSAGE), msgComp ), "Message.Tool" ); StrEditGraphic* stred = new StrEditGraphic("",nil,stdgraphic); StrEditComp* stredComp = new StrEditComp(stred); Include( new GraphicCompTool( new ControlInfo("StringEditor", KLBL_STREDIT, CODE_STREDIT), stredComp ), "String_Editor.Tool" ); GrBlockComp* grblockComp = new GrBlockComp(new GrBlockGraphic( nil, stdgraphic) ); Include( new GraphicCompTool( new ControlInfo("GraphicBlock", KLBL_GRBLOCK, CODE_GRBLOCK), grblockComp ), "Graphic_Block.Tool" ); StrBrowserGraphic* fb = new StrBrowserGraphic( "FileBrowser", 0, 0, nil, stdgraphic ); FBrowserComp* fbComp = new FBrowserComp(fb); Include( new GraphicCompTool( new ControlInfo("FileBrowser", KLBL_FBROWSER,CODE_FBROWSER),fbComp ), "File_Browser.Tool" ); StrBrowserGraphic* tg = new StrBrowserGraphic( "TextEditor", 0, 0, nil, stdgraphic ); TextEditComp* tComp = new TextEditComp(tg); Include( new GraphicCompTool( new ControlInfo( "TextEditor", KLBL_TEXTEDITOR, CODE_TEXTEDITOR ),tComp ), "TextEditor.Tool" ); StrBrowserGraphic* strg = new StrBrowserGraphic( "StringBrowser", 0, 0, nil, stdgraphic ); StrBrowserComp* strBrowserComp = new StrBrowserComp(strg); Include( new GraphicCompTool( new ControlInfo( "StringBrowser", KLBL_STRBROWSER, CODE_STRBROWSER ),strBrowserComp ), "StringBrowser.Tool" ); LMoverGraphic* lgr = new LMoverGraphic(nil, stdgraphic); adjcomp = new AdjusterComp(lgr); Include( new GraphicCompTool( new ControlInfo(adjcomp, KLBL_LMOVER, CODE_LMOVER), adjcomp ), "Left_Mover.Tool" ); RMoverGraphic* rgr = new RMoverGraphic(nil, stdgraphic); adjcomp = new AdjusterComp(rgr); Include( new GraphicCompTool( new ControlInfo(adjcomp, KLBL_RMOVER, CODE_RMOVER), adjcomp ), "Right_Mover.Tool" ); UMoverGraphic* ugr = new UMoverGraphic(nil, stdgraphic); adjcomp = new AdjusterComp(ugr); Include( new GraphicCompTool( new ControlInfo(adjcomp, KLBL_UMOVER, CODE_UMOVER), adjcomp ), "Up_Mover.Tool" ); DMoverGraphic* dgr = new DMoverGraphic(nil, stdgraphic); adjcomp = new AdjusterComp(dgr); Include( new GraphicCompTool( new ControlInfo(adjcomp, KLBL_DMOVER, CODE_DMOVER), adjcomp ), "Down_Mover.Tool" ); EnlargerGraphic* engr = new EnlargerGraphic(nil, stdgraphic); adjcomp = new AdjusterComp(engr); Include( new GraphicCompTool( new ControlInfo(adjcomp, KLBL_ENLARGER, CODE_ENLARGER), adjcomp ), "Enlarger.Tool" ); ReducerGraphic* regr = new ReducerGraphic(nil, stdgraphic); adjcomp = new AdjusterComp(regr); Include( new GraphicCompTool( new ControlInfo(adjcomp, KLBL_REDUCER, CODE_REDUCER), adjcomp ), "Reducer.Tool" ); MarginFrameGraphic* mg = new MarginFrameGraphic(nil, stdgraphic); MarginFrameComp* mfc = new MarginFrameComp(mg); Include( new GraphicCompTool( new ControlInfo( "MarginFrame", KLBL_MARGINFRAME, CODE_MARGINFRAME ), mfc ), "MarginFrame.Tool" ); PDMenuGraphic* pdgraphic = new PDMenuGraphic( "PulldownMenu", nil, stdgraphic ); PullMenuComp* pdcomp = new PullMenuComp(pdgraphic); Include( new GraphicCompTool( new ControlInfo("PulldownMenu", KLBL_PDCMD, CODE_PDCMD), pdcomp ), "PullDownMenu.Tool" ); PRMenuGraphic* prgraphic = new PRMenuGraphic( "PullRightMenu", nil, stdgraphic ); PullMenuComp* prcomp = new PullMenuComp(prgraphic); Include( new GraphicCompTool( new ControlInfo("PullrightMenu", KLBL_PRCMD, CODE_PRCMD), prcomp ), "PullRightMenu.Tool" ); PanelCtrlGraphic* comgr = new PanelCtrlGraphic( "CommandControl", Horizontal, nil, stdgraphic ); CommandCtrlComp* comComp = new CommandCtrlComp(comgr); Include( new GraphicCompTool( new ControlInfo( "CommandControl", KLBL_COMMANDCTRL, CODE_COMMANDCTRL ), comComp ), "CommandControl.Tool" ); PanelCtrlGraphic* hpcgr = new PanelCtrlGraphic( "HPanelControl", Horizontal, nil, stdgraphic ); PanelCtrlComp* hpcComp = new PanelCtrlComp(hpcgr); Include( new GraphicCompTool( new ControlInfo("HPanelControl", KLBL_HPCTRL, CODE_HPCTRL), hpcComp ), "HPanelControl.Tool" ); PanelCtrlGraphic* vpcgr = new PanelCtrlGraphic( "VPanelControl", Vertical, nil, stdgraphic ); PanelCtrlComp* vpcComp = new PanelCtrlComp(vpcgr); Include( new GraphicCompTool( new ControlInfo("VPanelControl", KLBL_VPCTRL, CODE_VPCTRL), vpcComp ), "VPanelControl.Tool" ); IBViewerComp* vcomp = new IBViewerComp(new IBViewerGraphic( nil, stdgraphic) ); Include( new GraphicCompTool( new ControlInfo( "Viewer", KLBL_IBVIEWER, CODE_IBVIEWER ), vcomp ), "Viewer.Tool" ); } void ToolPanel::ReadCompTools () { char path[CHARBUFSIZE]; char toolspath[CHARBUFSIZE]; GetToolsPath(toolspath); for (int i = 0; i < _edInfo->Count(); ++i) { const char* toolName = _edInfo->GetName(i); const char* info = _edInfo->GetInfo(i); Tool* tool; sprintf(path, "%s/%s", toolspath, toolName); unidraw->GetCatalog()->Retrieve(path, tool); GraphicCompTool* grtool = (GraphicCompTool*) tool; Include(tool, toolName); } } UControl* ToolPanel::FindControl (const char* toolName) { UArray& elems = ((IBHBox*) GetScene())->Components(); UControl* ctrl = nil; for (int i = 0; i < elems.Count(); ++i) { UControl* testCtrl = (UControl*) elems[i]; Tool* testTool = (Tool*) testCtrl->GetControlInfo()->GetOwner(); const char* testToolName = unidraw->GetCatalog()->GetName(testTool); if (testToolName != nil) { char* filename = strrchr(testToolName, '/') + 1; if (filename != nil && strcmp(toolName, filename) == 0) { ctrl = testCtrl; break; } } } return ctrl; }